https://leetcode.cn/problems/maximum-erasure-value/submissions/560518634/

class Solution {
public:
    int maximumUniqueSubarray(vector<int>& nums) {
        int maxsum = 0;  // 用于存储最大唯一子数组的和
        unordered_map<int, int> hash;  // 用于记录当前窗口内每个数字出现的次数

        int left = 0;  // 滑动窗口的左边界
        int right = 0;  // 滑动窗口的右边界
        int n = nums.size();  // 数组长度
        int sum = 0;  // 当前窗口内的元素总和

        while (right < n) {  // 右指针遍历整个数组
            sum += nums[right];  // 将新加入窗口的元素值加入到sum中
            hash[nums[right]]++;  // 更新哈希表中的计数

            // 如果当前窗口内有重复元素，则移动左指针以移除重复元素
            while (hash[nums[right]] > 1) {
                if (hash[nums[left]] == 1) {
                    hash.erase(nums[left]);  // 如果左边界的元素在窗口中只出现一次，则从哈希表中删除
                } else {
                    hash[nums[left]]--;  // 否则减少该元素的计数
                }
                sum -= nums[left];  // 从sum中减去被移出窗口的元素值
                left++;  // 左指针向右移动
            }

            maxsum = max(maxsum, sum);  // 更新最大唯一子数组的和
            right++;  // 右指针向右移动
        }

        return maxsum;  // 返回最大唯一子数组的和
    }
};